package main

import (
	"encoding/json"
	"fmt"
	"reflect"
)

// main
//
//	@Description:
//
// 反射基本介绍~
// 反射可以在运行时动态获取变量的各种信息，比如变量的类型（type），类别（kind）
// 如果是结构体变量，还可以获取到结构体本身包含的字段（field），方法（method），
// 通过反射，可以修改变量的值，还可以调用关联的方法
// 使用反射 需要 import (“reflect”)
func main() {
	jsonMarshal()
}

// jsonMarshal
//
//	@Description: jsonMarshal
func jsonMarshal() {
	var ms Monster = Monster{
		Name: "牛魔王",
		Age:  500,
		Sal:  8000.0,
		Sex:  "男",
	}
	marshal, _ := json.Marshal(ms)
	fmt.Println("json.Marshal=", string(marshal))
	//{"monsterName":"牛魔王","monsterAge":500,"monsterSal":8000,"monsterSex":"男"}

	typeOf := reflect.TypeOf(ms)
	fmt.Println("typeOf=", typeOf) //main.Monster
	valueOf := reflect.ValueOf(ms)
	fmt.Println("valueOf=", valueOf) //{牛魔王 500 8000 男}

}

type Monster struct {
	Name string  `json:"monsterName"`
	Age  int     `json:"monsterAge"`
	Sal  float64 `json:"monsterSal"`
	Sex  string  `json:"monsterSex"`
}

func (m *Monster) changeName(name string) {
	m.Name = name
	fmt.Println("name=", name)
}
